/*
    C++11多线程库中futher的使用
    futher: 用来保存异步结果的类模板，应用于异步任务、并发控制、结果获取等，通常需要和saync等这样的函数模板搭配使用
    async: 是一个函数模板，可以同步或异步的方式来完成任务
           任务的结果会被存放到futuer对象中，在异步线程中可以通过async返回的future对象来获取
*/

#include <iostream>
#include <future>
#include <thread>
#include <chrono>

int add(int num1, int num2)
{
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout << "add() is running..." << std::endl;
    return num1 + num2;
}

int main()
{
    // async: 异步执行任务(创建线程来完成)，当调用async函数的时候执行任务
    // deferred: 延迟执行任务(同步执行任务)，当通过future对象中的get方法获取结果的时候，才开始同步执行任务
    // std::future<int> res = std::async(std::launch::async, add, 1, 2);
    std::future<int> res = std::async(std::launch::deferred, add, 1, 2);
    std::this_thread::sleep_for(std::chrono::seconds(8));
    std::cout << "res is ready..." << std::endl;
    std::cout << "res: " << res.get() << std::endl; // 如果没有获取到结果会一致阻塞到这里
    return 0;
}